fanpl is package{
  contract A over %t is {
    pl has type (%t,%t)=>%t;
  }
  
  implementation A over integer is {
    pl(X,Y) is X+Y;
  }
  
  implementation A over array of %t where A over %t is {
    pl(A1,A2) is arPlus(A1,A2);
  }
  
  arPlus(array of {},array of {}) is array of {};
  arPlus(array of {E1;..L1}, array of {E2;..L2}) is array of {pl(E1,E2);..arPlus(L1,L2)};
  
  f(X) is pl(X,X);
  
  g(X) is let{
    h(U) is pl(U,X);
  } in h(X)
  
  main() do {
    assert pl(2,3)=5;
    
    assert f(2)=4;
  
    assert pl(array of {1;2;3}, array of {4;5;6}) = array of {5;7;9}
  }
}
